/************************************************************************************************
*Definicion de Nodo que contiene una variable y una etiqueta (cadena)                           *
*Author     :   Simon Emmanuel Gutierrez Brida                                                  *
*Version    :   0.1                                                                             *
*Fecha      :   Octubre/2011                                                                    *
*-------------------------------                                                                *
*Define la estructura y funciones asociadas para un Nodo a ser utilizado en listas encadenadas  *
*Un nodo esta formado por :                                                                     *
*- info         :   la informacion contenida por el nodo                                        *
*- siguiente    :   un puntero al siguiente nodo                                                *
*************************************************************************************************/

#ifndef NODO_PILA_H
#define NODO_PILA_H

#include "../variable.h"
#include "labelNeval.h"


struct NodoPila {
    LabelNEval *info;
    struct NodoPila *next;
};

typedef struct NodoPila NodoPila;

/*funciones publicas para manipular nodos*/

/*constructores*/

/**
 * Construye un nuevo nodo vacio
 */
NodoPila* nuevoNodoPila_vacio();

/**
 * Construye un nuevo nodo con una etiqueta y una variable
 * parametros
 * info: etiqueta
 * eval: variable
 * ---
 * si alguno de los datos no importa entonces se puede poner NULL
 */
NodoPila* nuevoNodoPila_info(char *info, Variable *eval);

/**
 * Construye un nuevo nodo con una etiqueta, una variable y un nodo siguiente
 * parametros
 * info: etiqueta
 * eval: variable
 * siguiente: nodo siguiente
 * ---
 * si alguno de los datos (etiqueta o variable) no importa entonces se puede poner NULL
 */
NodoPila* nuevoNodoPila_info_siguiente(char *info, Variable *eval, NodoPila *siguiente);

/*lectura de informacion*/

/**
 * Obtiene la informacion de un nodo en forma de una estructura que contiene una etiqueta y una variable
 * parametros
 * nodo: el nodo del cual obtener la informacion
 */
LabelNEval* obtenerInfo_nodoPila(NodoPila *nodo);

/**
 * Obtiene el nodo que le sigue a otro
 * parametros
 * nodo: el nodo del cual obtener el siguiente
 */
NodoPila* obtenerSiguiente_nodoPila(NodoPila *nodo);

/*escritura de informacion*/

/**
 * Define la informacion contenida por un nodo
 * parametros
 * nodo: el nodo al cual definir la informacion
 * info: una etiqueta
 * eval: una variable
 * ---
 * si alguno de los datos (etiqueta o variable) no importa entonces se puede poner NULL
 */
void definirInfo_nodoPila(NodoPila *nodo, char *info, Variable *eval);

/**
 * Define el nodo siguiente a otro
 * parametros
 * nodo: el nodo al cual definirle el siguient
 * siguiente: el nodo siguiente
 */
void definirSiguiente_nodoPila(NodoPila *nodo, NodoPila *siguiente);

#endif